package com.richpay.basejava.base10;

/**
 * 数据类型转换
 *
 * A.发生方法重写的情况下(对于实例（非静态）方法),编译看左边(如果不存在这个方法则编译报错)，运行看右边。
 *  Animal al=new Cat();
 *  al.eat();
 *
 * B.父类和子类具有相同的成员变量，编译看左边(如果不存在这个变量则编译报错),运行也看左边。
 *  Animal al=new Cat();
 *  System.out.println("al.name"+al.name);
 *
 * C.对于静态变量而言：编译看左边(如果不存在这个变量则编译报错)，运行也看左边
 *
 * D.对于静态方法而言：编译看左边(如果不存在这个变量则编译报错)，运行也看左边
 *
 * 总结论：对于实例方法而言：编译看左边，运行看右边，其它的全部是编译看左边，运行也看左边.
 */
public class DataTypeConvertDemo {
    public static void main(String[] args){
        Animal al=new Animal("小黑",5);
        al.eat();
        System.out.println("==========");
        Cat cat=new Cat("小花",3);
        cat.eat();
        System.out.println("==========");
        Animal animal= new Cat("小黄",4);
        animal.eat();
        System.out.println("==========");
        /**
         * 父类的引用指向了子类的实例，执行时调用的是子类中的方法，这就是java的多态性
         */
        Animal al1=new Cat();//子类自动转化成父类，目的是可以使用通过父类的功能，增强参数传递的灵活性。
        al1.eat();//执行的是Cat类中的方法，即子类的方法。
        System.out.println("al1.name="+al1.name);//运行是左边的属性即父类的属性

        // al1.catchMouse();//编译报错，子类的对象一旦自动转化成父类对象后，就丢失了自己特有的功能。
        //如果想使用子类特有的功能，可以将父类转化成子类使其还原自己特有的功能。

        if(al1 instanceof Cat){
            Cat cat1= (Cat) al1;//向下转型，父类转化成子类，还原子类特有的功能。
            cat1.catchMouse();
        }

        //Pig pig=(Pig)al;//报错： java.lang.ClassCastException::Dog cannot be cast to Pig
        //向下转型要想成功：必须是子类先向上转型成父类对象，然后父类对象再向下转型成之前的子类对象.


        System.out.println("al.name="+al.name);
        System.out.println("al.count="+al.count);

        al.show();




    }
}
